需求說明
在資料庫的 Audit (稽核) 部份,需要有一套如同 SQL Server 的方式來執行。
MariaDB Server Audit Plugin
好在 MariaDB 有 Server Audit Plugin,相關文件在此。
開起來很簡單,設定也很容易。
MariaDB Server Audit Plugin 與 SQL Sever Trace File Audit 的比較
SQL Server 的 Audit 是用 Trace File 來儲存 Audit 資料,以下用一個表格做一個比較
項目 | SQL Server Trace File Audit | MariaDB Server Audit Plugin |
---|---|---|
儲存方式 | Binary File 自有格式 | Text File (逗號隔開), syslog |
取用方式 | fn_trace_gettable() 取得資料 |
打開檔案或是 syslog client |
紀錄分類方式與數量 | 20 種 Class,每個 Class 數個 Events (2012.aspx)) | 8 種 (CONNECT , QUERY , READ , WRITE , CREATE , ALTER , RENAME , DROP ) |
資料的控制 | sp_trace_* 設定人事時地物,檔案需要自己處理 |
server_audit_* 設定人事時地物,有 rotate 設定 |
設定說明
在文件裡 Logging events 一節提到的可設定的 Type,說明如下
CONNECT
就是連線訊息QUERY
執行 SQL 指令與結果代碼TABLE
哪些 Tables 因此QUERY
而受影響QUERY_DDL
DDL 的 Query,是QUERY
的子集合QUERY_DML
DML 的 Query,是QUERY
的子集合QUERY_DCL
DCL 的 Query,是QUERY
的子集合
什麼是預設的 DDL, DML, DCL 的 Query 呢? 這邊要看 Code 才知道,因為後續會有改程式碼的動作,所以到時一併說明之。
另外一個部份是 Output 的 Operation 欄位,有 CONNECT
, QUERY
, READ
, WRITE
, CREATE
, ALTER
, RENAME
, DROP
,這部份的詳細定義也是要看 Code。
客製化 Server Audit Plugin
原來的 Server Audit Plugin 其實大部份的需求都可以達成了,如果有自己做 Log Server 的需求,需要更細緻的分類,因為有些資訊可以延遲送出(如日報表),但是特權帳號的使用要馬上通報給其他長官,光只有這 8 種情形無法滿足需求。
針對 DDL 與 DCL 加入更細緻的分類
這邊先來看看 MariaDB 對於 DDL 與 DCL 是怎麼判斷的,首先到官網下載原始碼 (如 10.1.17),不要到 github 上抓,因為那太新了。
Code 分析與修改
到 plugin\server_audit\server_audit.c
找到以下程式碼
1 | enum sa_keywords |
以上可以看的的出來 DDL 是哪些會算,哪些不會算,譬如說 DROP
, DROP User
算是 DDL,但是 DROP Function
不算 DDL。
1 |
|
這邊可以看得出來 DML。
1 | struct sa_keyword dcl_keywords[]= |
這邊可以看得出來 DCL。1
2
3
4
5
6
7
8
9
10
11
struct sa_keyword passwd_keywords[]=
{
{3, "SET", &password_word, SQLCOM_SET_OPTION},
{5, "ALTER", &server_word, SQLCOM_ALTER_SERVER},
{5, "GRANT", 0, SQLCOM_GRANT},
{6, "CREATE", &user_word, SQLCOM_CREATE_USER},
{6, "CREATE", &server_word, SQLCOM_CREATE_SERVER},
{6, "CHANGE", &master_word, SQLCOM_CHANGE_MASTER},
{0, NULL, 0, SQLCOM_NOTHING}
};
這邊說明什麼時候會碰到密碼 (在 log 裡會紀錄動作,然後把密碼用星號表示)。
接下來找到以下的程式碼
1 | static int log_statement_ex(const struct connection_info *cn, |
這邊的 Code 說明有許多的紀錄後來會被標記成 QUERY
,如果要利用原來已經分類的 DCL 與 DDL 架構,這邊就要先來利用一下。
1 | static int log_statement_ex(const struct connection_info *cn, |
Build Plugin
接下來要來 Build Plugin,根據這個文件,安裝該安裝的函式庫與工具,以下紀錄一下
- Visual Studio 2015 Community 版
- Bison (記得路徑不要有空白)
- cmake
- Windows SDK 8.1 (這個現在沒裝沒關係,等會可以裝)
Build 方式,在 Source 底下
mkdir bld
cd bld
cmake .. -G "Visual Studio 14 2015 Win64"
(64 位元版)cmake --build . --config Relwithdebinfo
會碰到的錯 (然後會有一大堆的 warning)
Windows SDK 8.1 沒裝
這個要去
bld
底下用 IDE 開MySQL.sln
,打開的時候他會說你的 SDK 缺少,要不要下載安裝,讓他自己跑完就可以了。sql\sql_locale.cc
有怪字無法編譯我查到的結果都是開 notepad++ 去改 utf-8,不過我做完還是失敗,後來是開 notepad 然後用 unicode 儲存 (不是 utf-8 喔) 就可以過了。
測試
把 MariaDB 停掉,從 bld\plugin\server_audit\RelWithDebInfo
把 dll 跟 pdb 複製到 MariaDB\lib
下,重開看看。
原來的 log 大概像這樣1
20161003 13:15:58,WSTest,sujunmin,localhost,98,783,QUERY,test1,'REVOKE RELOAD ON *.* FROM \'lsuser\'@\'%\'',0
應該會變成這樣1
20161003 16:31:14,WSTest,sujunmin,localhost,98,783,QUERY_DCL,test1,'REVOKE RELOAD ON *.* FROM \'lsuser\'@\'%\'',0
後續的 Log Parser 就可以根據這些關鍵字來分析使用了。